package fr.mma.livraison.controller;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import fr.mma.livraison.comparator.ApplicationComparator;
import fr.mma.livraison.model.EtatLivraison;
import fr.mma.livraison.model.dto.ApplicationDTO;
import fr.mma.livraison.model.dto.DeveloppeurDTO;
import fr.mma.livraison.model.dto.LivraisonApplicationDTO;
import fr.mma.livraison.model.dto.LivraisonDTO;
import fr.mma.livraison.model.persistence.Application;
import fr.mma.livraison.model.persistence.Developpeur;
import fr.mma.livraison.model.persistence.Livraison;
import fr.mma.livraison.model.persistence.LivraisonApplication;

import static fr.mma.achievement.controller.Factory.buildAchievement; 

public final class Factory {

	private static DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE);

	private Factory() {
	};

	public static DeveloppeurDTO build(final Developpeur devMetier) {
		final DeveloppeurDTO developpeur = new DeveloppeurDTO();
		developpeur.setTrigram(devMetier.getTrigram());
		developpeur.setLastLivraison(build(devMetier.getLastLivraison()));
		developpeur.setNombreLivraison(Integer.toString(devMetier.getNombreLivraison()));
		developpeur.setName(devMetier.getName());
		developpeur.setAchievements(buildAchievement(devMetier.getAchievements()));
		return developpeur;
	}

	public static Collection<DeveloppeurDTO> buildDev(final Collection<Developpeur> devMetiers) {
		final Collection<DeveloppeurDTO> developpeurs = new ArrayList<DeveloppeurDTO>();
		for (Developpeur devMetier : devMetiers) {
			developpeurs.add(build(devMetier));
		}
		return developpeurs;
	}

	public static LivraisonDTO build(final Livraison livraisonMetier) {
		final LivraisonDTO livraison = new LivraisonDTO();
		livraison.setIdentifiant(livraisonMetier.getIdentifiant());
		livraison.setDate(dateFormat.format(new Date(livraisonMetier.getIdentifiant())));
		livraison.setName(livraisonMetier.getName());
		livraison.setTermine(livraisonMetier.isTermine());
		return livraison;
	}

	public static Collection<LivraisonDTO> buildLivraison(final Collection<Livraison> livraisonMetiers) {
		final Collection<LivraisonDTO> livraisons = new ArrayList<LivraisonDTO>();
		for (Livraison livraisonsMetier : livraisonMetiers) {
			livraisons.add(build(livraisonsMetier));
		}
		return livraisons;
	}

	public static LivraisonApplicationDTO build(final LivraisonApplication livraisonAppMetier, final Developpeur developpeurMetier, final Application applicationMetier) {
		final LivraisonApplicationDTO livraisonApp = new LivraisonApplicationDTO();
		final ApplicationDTO application = build(applicationMetier);
		application.setVersion(livraisonAppMetier.getVersion());
		livraisonApp.setApplication(application);
		livraisonApp.setId(livraisonAppMetier.getId());
		livraisonApp.setEtat(livraisonAppMetier.getEtat());
		livraisonApp.setEnCours(EtatLivraison.EN_COURS.equals(livraisonAppMetier.getEtat()));
		if (developpeurMetier != null) {
			livraisonApp.setDeveloppeur(build(developpeurMetier));
		}
		return livraisonApp;
	}

	public static Collection<ApplicationDTO> buildApplication(final Collection<Application> applicationMetierList) {
		final List<ApplicationDTO> applicationList = new ArrayList<ApplicationDTO>();
		for (Application applicationMetier : applicationMetierList) {
			applicationList.add(build(applicationMetier));
		}
		Collections.sort(applicationList, new ApplicationComparator());
		return applicationList;
	}

	public static ApplicationDTO build(final Application applicationMetier) {
		final ApplicationDTO application = new ApplicationDTO(applicationMetier.getName());
		application.setPriorite(applicationMetier.getPriorite());
		if (applicationMetier.getType() != null) {
			application.setType(applicationMetier.getType());
		}
		return application;
	}

	public static long build(final String date) {
		long dateLong;
		try {
			dateLong = dateFormat.parse(date).getTime();
		} catch (ParseException e) {
			dateLong = 0;
		}
		return dateLong;
	}

	public static String build(final long date) {
		return dateFormat.format(new Date(date));
	}
}
